home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / SoundAndMusic / cmix / Minc / p.y < prev    next >
Text File  |  1991-03-16  |  5KB  |  215 lines

  1.  
  2.  
  3.  
  4. %{
  5. #include "defs.h"
  6. #include "lex.yy.c"
  7. #include "ext.h"
  8. #define YYDEBUG
  9. #define MAXIDLIST 200
  10.  
  11. int   i1,i2,i3,i4,i5,i6,i7,i8,i9;
  12. double atof(),f1,f2,f3,f4,f5,f6,f7,f8,f9,d1;
  13. char  *c1,*c2,*c3;
  14. Tree    tp1,tp2,tp3,tp4,tp5,tp6,tp7,tp8,tp9;
  15. SYMBOL    *sp1,*sp2,*sp3,*sp4,*sp5,*sp6,*sp7,*sp8,*sp9;
  16. int     idcount =0;    
  17. char    *idlist[MAXIDLIST];  
  18. int     interactive;
  19. char    str[200];
  20. char    strp;
  21. int     flerror;      /* set if there was an error during parsing */
  22. int    level=0;        /* keeps track whether we are in a structure*/
  23. %}
  24.  
  25. %left  <ival>LOWPRIO
  26. %left  <ival> '='
  27. %left  <ival>T_OR
  28. %left  <ival>T_AND
  29. %left  <ival>  T_EQU UNEQU
  30. %left  <ival>'<' '>'  LESSEQU GTREQU
  31. %left  <ival>'+' '-'
  32. %left  <ival>'*' '/'
  33. %left  <ival>T_POW
  34. %left  <ival> CASTTOKEN
  35. %token <ival>FLT CTOO CTOL OTOL OTOC LTOO LTOC
  36. %token <ival>ID NUM T_NOT IF ELSE FOR WHILE 
  37. %token <ival>T_TRUE T_FALSE STRING 
  38. %type  <trees> stml stmt rstmt bexp expl exp str
  39. %type  <str>  id 
  40.  
  41. %%
  42. prg:    stml         {program = $1;return (0);}
  43.     ;
  44.  
  45. stml :        stmt          {$$ = $1;}        
  46.     |   stml  stmt      {$$ = tseq($1,$2);}
  47.     |   stmt ";"          {$$ = $1;}        
  48.     |   stml  stmt ";"  {$$ = tseq($1,$2);}
  49.     ;
  50.  
  51. stmt:        FLT idl         { declare(T_FLOAT);idcount=0;}
  52.     |   rstmt        {
  53.                 if (level==0) 
  54.                     $$ = go($1); 
  55.                 else    $$ = $1;
  56.                 }
  57.     |   IF level bexp stmt         {
  58.                     level--;
  59.                     $$ = go(tif($3,$4));
  60.                     }
  61.     |   IF level bexp stmt ELSE stmt {
  62.                     level--;
  63.                     $$ = go(tifelse($3,$4,$6));
  64.                     } 
  65.     |   WHILE level bexp stmt    {
  66.                     level--;
  67.                     $$ = go(twhile($3,$4));
  68.                     } 
  69.     |   FOR level '(' stmt ';' bexp ';' stmt ')' stmt {
  70.                     level--;
  71.                     $$ = go(tfor($4,$6,$8,$10));
  72.                     }
  73.     |   '{' stml '}'        {$$ = $2;} 
  74.     |   error FLT            {flerror = 1;$$=tnoop();}
  75.     |   error IF            {flerror = 1;$$=tnoop();}
  76.     |   error WHILE            {flerror = 1;$$=tnoop();}
  77.     |   error FOR            {flerror = 1;$$=tnoop();}
  78.     |   error '{'            {flerror = 1;$$=tnoop();}
  79.     |   error ELSE            {flerror = 1;$$=tnoop();}
  80.     |   error ';'            {flerror = 1;$$=tnoop();}
  81.     ;
  82.     /*  statements that can return a value */
  83. level:                          {
  84.                     level++;
  85.                 }
  86.  
  87. rstmt:    id  '=' exp        {
  88.                     sp1=lookup($1);
  89.                     if (sp1==NULL) {
  90.                sprintf(str,"note: %s has been auto declared",$1);
  91.                 sp1=install($1,S_GLOBAL,T_FLOAT);
  92.                              yyerror (str);     
  93.                     }
  94.                     $$ = tstore(tname(sp1),$3); 
  95.                 }
  96.     |   id '(' expl ')'          {$$ = tcall ($3,$1);}    
  97.     ;
  98.  
  99.  
  100. idl:        id                { idlist[idcount++]=$1;}
  101.     |   idl ',' id            { idlist[idcount++]=$3;}
  102.     ;
  103.  
  104. id:        ID                { $$ = strsave(yytext);}
  105.     ;    
  106.  
  107. expl:       exp            {$$ = targ(tnoargs(),$1);}
  108.     |   expl ',' exp    { $$ = targ($1,$3); }
  109. /* NOTE: on casting of strings:  first, cast char* into an int, then
  110. cast the int into a double(not float).  To convert back, do just the
  111. opposite */
  112.     |   str         { 
  113.             $$ = targ(tnoargs(),$1);
  114.             }
  115.     |   expl ',' str    {
  116.             $$ = targ($1,$3);
  117.             }
  118.     |            {$$ = tnoargs();}
  119.     ;
  120. str:       STRING    {
  121.             c1 = yytext + 1;
  122.             c1[strlen(c1)-1]= '\0';
  123. /* Here we do some weird conversion from char* to int to double.
  124.  * It is a hack that allows to pass strings to cmix functions, 
  125.  * in a way, that only the function needs to know about it.
  126.  * It very likely to be machine dependent, so you might have to hack it
  127.  * if it doesn't work on your system.  If you do, send me mail. ***lars.
  128.  * (It might help to look at the assembler output produced by cc)
  129.  */
  130.             i1 =  strsave(c1);
  131.             d1 = (double) i1;
  132.             $$ = tconstf(d1);
  133.             }    
  134.     ;
  135.  
  136. bexp:        exp        %prec LOWPRIO           { $$ = $1;}
  137.     |   T_NOT bexp   %prec UNEQU { $$ = tnot($2);    }           
  138.     |   bexp T_AND bexp   { $$ = tcand($1,$3);   }
  139.     |   bexp T_OR  bexp   { $$ = tcor($1,$3);  } 
  140.         /* note the comparison of booleans */
  141.     |   bexp T_EQU bexp   { $$ = trel(EQ,$1,$3); }
  142.     |   exp '<' exp   { $$ = trel(LT,$1,$3); }
  143.     |   exp '>' exp   { $$ = trel(GT,$1,$3);}
  144.     |   exp UNEQU exp   { $$ = trel(NEQ,$1,$3);}
  145.     |   exp LESSEQU exp { $$ = trel(LEQ,$1,$3); } 
  146.     |   exp GTREQU  exp { $$ = trel(GEQ,$1,$3); }
  147.     |   T_TRUE  {
  148.             $$ = trel (EQ,tconstf(1.0),tconstf(1.0));
  149.             }
  150.     |   T_FALSE {
  151.             $$ = trel (NEQ,tconstf(1.0),tconstf(1.0));
  152.             }
  153.         ;    
  154.  
  155. exp:        exp T_POW exp     { $$ = top(POW,$1,$3); }
  156.     |   rstmt          { $$ = $1;}
  157.     |   exp '*' exp     { $$ = top(MUL,$1,$3); }
  158.     |   exp '/' exp     { $$ = top(DIV,$1,$3); }
  159.     |   exp '+' exp     { $$ = top(PLUS,$1,$3); }
  160.     |   exp '-' exp     { $$ = top(MINUS,$1,$3); }
  161.     |   '(' bexp ')' { $$ = $2;}
  162.     |   NUM  {
  163.             f1 = atof(yytext);
  164.             $$ = tconstf(f1);
  165.                }
  166.     |   '-' NUM     %prec CASTTOKEN {
  167.             f1 = atof(yytext);
  168.             $$ = tconstf(-f1);
  169.                }
  170.     |   id    {
  171.         
  172.         sp1=lookup($1);
  173.         if (sp1==NULL) {
  174.           sprintf(str,"error: %s is not declared",$1);
  175.             yyerror (str);     
  176.           $$ = tconstf(0.0);
  177.         }else  $$ = tname(sp1);
  178.     }
  179.         
  180.         
  181.     ;
  182.  
  183.  
  184.  
  185.  
  186. %%
  187.  
  188. declare(type)
  189. int   type;
  190. {
  191.  
  192. int  i1;
  193. SYMBOL  *sp1;
  194.  
  195.   for (i1=0;i1<idcount;i1++) {
  196.  
  197.     sp1 = lookup (idlist[i1]);
  198.     if (sp1 != NULL) {
  199.         sprintf(str,"warning: variable redefined: %s",idlist[i1]);
  200. /*  note this handling may be illegal in arbitrary scoping */
  201.         sp1->type = type;
  202.         yyerror(str);
  203.     }
  204.     else install(idlist[i1],S_GLOBAL,type);
  205.   }
  206. }    
  207.  
  208. Tree go (t1)
  209. Tree t1;
  210. {
  211.     if (interactive && level==0)   exct(t1);
  212.     if (interactive && level==0)   free_tree(t1);
  213.     return (t1);
  214. }
  215.